home *** CD-ROM | disk | FTP | other *** search
/ The Mac Mega CD - Killer Software / The Mac Mega CD - Killer Software (May 1996).dmg / Shareware City / Sound / MacMikMod 2.10+src / source / drv_mac.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-04  |  3.0 KB  |  158 lines  |  [TEXT/CWIE]

  1. /*
  2.  
  3. Name:
  4. DRV_MAC.C
  5.  
  6. Description:
  7. Mikmod driver for output on Macintosh sound card
  8. © 1996 Dmitry Boldyrev
  9.  
  10. NOTE: If you use any ideas from this portion of code, please give me credit.
  11.  
  12. Portability:
  13.  
  14. MSDOS:    n
  15. Win95:    n
  16. Linux:    n
  17. Macintosh: y
  18.  
  19. (y) - yes
  20. (n) - no (not possible or not useful)
  21. (?) - may be possible, but not tested
  22. */
  23.  
  24. #ifndef __SOUND__
  25. #include <Sound.h>
  26. #endif
  27.  
  28. #include "mikmod.h"
  29.  
  30. #define MACBUFFERSIZE             8192
  31.  
  32. static SndChannel*                gSndChannel;
  33. static SndDoubleBufferHeader     doubleHeader;
  34.  
  35. BOOL MAC_IsThere(void)
  36. {
  37.     return 1;
  38. }
  39.  
  40. static pascal void MyDoubleBackProc(SndChannelPtr chan, SndDoubleBufferPtr doubleBuffer)
  41. {
  42.     long    oldA5;
  43.  
  44.     oldA5 = SetA5 (doubleBuffer->dbUserInfo[0]);
  45.     
  46.     doubleBuffer->dbNumFrames = VC_WriteBytes(&doubleBuffer->dbSoundData[0], MACBUFFERSIZE) >> 2;
  47.     doubleBuffer->dbFlags |= dbBufferReady;
  48.     
  49.     SetA5 (oldA5);
  50. }
  51.  
  52. BOOL MAC_Init(void)
  53. {
  54.     OSErr         iErr;
  55.     SndCommand    Cmd;
  56.  
  57.     iErr = SndNewChannel(&gSndChannel, sampledSynth, 
  58.                          ((md_mode & DMODE_STEREO) ? initStereo : initMono) | initNoInterp, 
  59.                          NULL);
  60.     if (iErr != noErr)
  61.     {
  62.         printf("SndNewChannel() -> %d\n", iErr);
  63.         return 0;
  64.     }
  65.     Cmd.cmd = ampCmd;
  66.     Cmd.param1 = 255;
  67.     Cmd.param2 = 0;
  68.     iErr = SndDoImmediate(gSndChannel, &Cmd);
  69.     if (iErr != noErr)
  70.     {
  71.         printf("SndDoImmediate() -> %d\n", iErr);
  72.         return 1;
  73.     }
  74.     if(!VC_Init()) {
  75.         SndDisposeChannel(gSndChannel, TRUE);
  76.         return 0;
  77.     }
  78.  
  79.     return 1;
  80. }
  81.  
  82. void MAC_Exit(void)
  83. {
  84.     SndCommand        Cmd;
  85.     int                i;
  86.     
  87.     VC_Exit();
  88.     
  89.     SndDisposeChannel(gSndChannel, TRUE);
  90. }
  91.  
  92. void MAC_PlayStart(void)
  93. {
  94.     OSErr                iErr;
  95.     int                 i;
  96.     SndDoubleBufferPtr     doubleBuffer;
  97.     
  98.     VC_PlayStart();
  99.     doubleHeader.dbhNumChannels     = (md_mode & DMODE_STEREO) ?  2 : 1;    // stereo or mono?
  100.     doubleHeader.dbhSampleSize         = (md_mode & DMODE_16BITS) ? 16 : 8;    // 16 bit or 8 bit sampling?
  101.     doubleHeader.dbhCompressionID     = 0;
  102.     doubleHeader.dbhPacketSize         = 0;
  103.     doubleHeader.dbhSampleRate         = md_mixfreq << 16;    // Fixed sampling rate
  104.     doubleHeader.dbhDoubleBack         = NewSndDoubleBackProc(MyDoubleBackProc);
  105.  
  106.     for (i = 0; i <= 1; i++) {
  107.         doubleBuffer = (SndDoubleBufferPtr) NewPtr (sizeof (SndDoubleBuffer) + 
  108.                                                     MACBUFFERSIZE);
  109.         if (!doubleBuffer) {
  110.             return;
  111.         }
  112.  
  113.         //    Initialize the Doubler buffers
  114.         doubleBuffer->dbNumFrames = 0;
  115.         doubleBuffer->dbFlags = 0;
  116.         doubleBuffer->dbUserInfo[0] = SetCurrentA5();
  117.     
  118.         //    Feed the doublerBuffers with samples
  119.         MyDoubleBackProc(gSndChannel, doubleBuffer);
  120.         doubleHeader.dbhBufferPtr[i] = doubleBuffer;
  121.     }
  122.     iErr = SndPlayDoubleBuffer(gSndChannel, &doubleHeader);
  123. }
  124.  
  125. void MAC_PlayStop(void)
  126. {
  127.     SndCommand    Cmd;
  128.  
  129.     VC_PlayStop();
  130.     Cmd.cmd = quietCmd;
  131.     Cmd.param1 = 0;
  132.     Cmd.param2 = 0;
  133.     SndDoImmediate(gSndChannel, &Cmd);
  134. }
  135.  
  136. static void MAC_Update(void)
  137. {
  138.     // [DEMOS]-> Interrupt driven synthesis (no updates needed)
  139. }
  140.  
  141. DRIVER drv_mac = {
  142.     NULL,
  143.     "MAC driver",
  144.     "v1.0",
  145.     MAC_IsThere,
  146.     VC_SampleLoad,
  147.     VC_SampleUnload,
  148.     MAC_Init,
  149.     MAC_Exit,
  150.     MAC_PlayStart,
  151.     MAC_PlayStop,
  152.     MAC_Update,
  153.     VC_VoiceSetVolume,
  154.     VC_VoiceSetFrequency,
  155.     VC_VoiceSetPanning,
  156.     VC_VoicePlay
  157. };
  158.